package monitormercado.framework;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;


public class Agendador {

	private Timer timerAtualizacao = new Timer();
	private List<Agendamento> agendamentos = new ArrayList<Agendamento>();
	private static Agendador instancia;
	private Calendar calendario = Calendar.getInstance();
	
	
	public static Agendador getInstancia() {
		if (instancia == null) {
			instancia = new Agendador();			
		}
		return instancia;
	}

	private Agendador() {
		TimerTask tarefa = new TimerTask() {
		
			@Override
			public void run() {
				verificarAgendamentos();
			}
		};
		
		timerAtualizacao.schedule(tarefa, 100, 1000 * 60); // um minuto
	}

	public void agendar(Agendamento agendamento) {
		agendamentos.add(agendamento);
	}
	
	private Calendar getCalendarioAtualizado() {
		calendario.setTimeInMillis(System.currentTimeMillis());
		return calendario;
	}
	
	private void verificarAgendamentos() {
		Date time = getCalendarioAtualizado().getTime();
		for (Agendamento agendamento : agendamentos) {
			if (agendamento.isExecutarAgendamento(time)) {
				try {
					agendamento.executar();
				} catch (Exception e) {
					e.printStackTrace();
				}
				agendamento.definirProximaExecucao();
			}
		}
		
	}


}
